"use strict";
define(function(require, exports, module) {
	/**
	 * 阻止默认事件
	 * @param {Object} e 事件对象
	 */
	exports._stopDefaultEvent = function(e) {
		if(e) {
			e.stopPropagation && e.stopPropagation();
			e.preventDefault && e.preventDefault();
			e.stopDefaultEvent && e.stopDefaultEvent();
			e.returnValue = false;
		}
		return false;
	};
	/**
	 * 获取地址栏参数值
	 * @param {Object} p
	 */

	exports._getURLParam = function(p) {
		var href = window.location.href,
			s = window.location.search, //.substr(1),
			//判断参数前面为?或&，否则会出现重叠，比如userid和id，会取到的值都为userid的值
			reg = new RegExp("[\?|&]" + p + "=([^&]*)"),
			sp = '?',
			ps = s.match(reg);

		if(ps != null) { // 说明该参数存在
			return ps[1];
		} else {
			return null;
		}
	};
	/**
	 * 获取跳转路径，自动拼接参数
	 * @param {String} url 待跳转路径
	 * @param {String} p 待拼接参数值
	 */
	exports._searchUrl = function(url, p) {
		var v = this._getURLParam(p);
		if(v) {
			return url + (p ? ('?' + p + '=' + v) : '');
		} else {
			return url;
		}
	};
	/**
	 * 计算字符串中每个字符出现的次数
	 * @param {Object} str 字符串
	 * @param {Object} max 最大值
	 */
	exports._charCnt = function(str, max) {
		if(!str || str.length == 0) {
			return str;
		}
		var r = '',
			rt = [],
			rcnt = 0;
		for(var i = 0; i < str.length; i++) {
			if(r == str.charAt(i)) {
				rcnt++;
				if(rcnt >= max) {
					rt.push(r);
				}
			} else {
				r = str.charAt(i);
				rcnt = 1;
			}
		}
		return rt;
	};
	/**
	 * 分析路径
	 * @param {Object} url 路径值
	 */
	exports._parseURL = function(url) {
		var a = document.createElement('a');
		a.href = url;
		return {
			source: url,
			protocol: a.protocol.replace(':', ''),
			host: a.hostname,
			port: a.port,
			query: a.search,
			params: (function() {
				var ret = {},
					seg = a.search.replace(/^\?/, '').split('&'),
					len = seg.length,
					i = 0,
					s;
				for(; i < len; i++) {
					if(!seg[i]) {
						continue;
					}
					s = seg[i].split('=');
					ret[s[0]] = s[1];
				}
				return ret;

			})(),
			file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
			hash: a.hash.replace('#', ''),
			path: a.pathname.replace(/^([^\/])/, '/$1'),
			relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
			segments: a.pathname.replace(/^\//, '').split('/')
		};
	};
	/**
	 * 替换myUrl中的同名参数值
	 * @param {Object} myUrl 地址
	 * @param {Object} newParams 新的参数对象
	 */
	exports._replaceUrlParams = function(myUrl, newParams) {
		myUrl = this._parseURL(myUrl);
		for(var x in newParams) {
			var hasInMyUrlParams = false;
			for(var y in myUrl.params) {
				if(x.toLowerCase() == y.toLowerCase()) {
					myUrl.params[y] = newParams[x];
					hasInMyUrlParams = true;
					break;
				}
			}
			//原来没有的参数则追加
			if(!hasInMyUrlParams) {
				myUrl.params[x] = newParams[x];
			}
		}
		var _result = myUrl.protocol + "://" + myUrl.host + ":" + myUrl.port + myUrl.path + "?";

		for(var p in myUrl.params) {
			_result += (p + "=" + myUrl.params[p] + "&");
		}

		if(_result.substr(_result.length - 1) == "&") {
			_result = _result.substr(0, _result.length - 1);
		}

		if(myUrl.hash != "") {
			_result += "#" + myUrl.hash;
		}
		return _result;
	};
	/**
	 * 获取元素父元素
	 * @param {Object} el 当前元素
	 * @param {Object} filter 过滤条件
	 */
	exports._getElParent = function(el, filter) {
		if(el.tagName == filter) {
			return el;
		} else {
			return this._getElParent(el.parentNode, filter);
		}
	};
	/**
	 * 获取元素父元素
	 * @param {Object} el 当前元素
	 * @param {Object} filter 过滤条件
	 */
	exports._getElParentByClass = function(el, filter) {
		if(!el.classList || el.classList.contains(filter)) {
			return el;
		} else {
			return this._getElParentByClass(el.parentNode, filter);
		}
	};
	/**
	 * 写cookie
	 * @param {Object} objName cookie名称
	 * @param {Object} objValue cookie值
	 * @param {Object} objHours cookie有效期
	 */
	exports._addcookie = function(objName, objValue, objHours) {
		//添加cookie  
		var str = objName + "=" + escape(objValue);
		objHours = objHours || 30 * 24;
		if(objHours > 0) {
			//为0时不设定过期时间，浏览器关闭时cookie自动消失  
			var date = new Date();
			var ms = objHours * 3600 * 1000;
			date.setTime(date.getTime() + ms);
			str += "; expires=" + date.toGMTString() + ';path=/';
		}
		document.cookie = str;
	};
	/**
	 * 读取cookie
	 * @param {Object} objName cookie名称
	 */
	exports._getcookie = function(objName) { //获取指定名称的cookie的值  
		var arrStr = document.cookie.split("; ");
		for(var i = 0; i < arrStr.length; i++) {
			var temp = arrStr[i].split("=");
			if(temp[0] == objName) return unescape(temp[1]);
		}
		return "";
	};
	/**
	 * 删除cookie
	 * @param {Object} objName cookie名称
	 */
	exports._clearcookie = function(objName) { //获取指定名称的cookie的值  
		this._addcookie(objName, "", -1);
	};
	/**
	 * 格式化货币
	 * @param {Object} value 待格式化值
	 * @param {Object} currency 格式化符号
	 * @param {Object} decimals 小数点位数
	 */
	exports._currency = function(value, currency, decimals) {
		var digitsRE = /(\d{3})(?=\d)/g
		value = parseFloat(value)
		if(!isFinite(value) || (!value && value !== 0)) return ''
		currency = currency != null ? currency : '¥'
		decimals = decimals != null ? decimals : 2
		var stringified = Math.abs(value).toFixed(decimals)
		var _int = decimals ?
			stringified.slice(0, -1 - decimals) :
			stringified
		var i = _int.length % 3
		var head = i > 0 ?
			(_int.slice(0, i) + (_int.length > 3 ? ',' : '')) :
			''
		var _float = decimals ?
			stringified.slice(-1 - decimals) :
			''
		var sign = value < 0 ? '-' : ''
		return sign + currency + head +
			_int.slice(i).replace(digitsRE, '$1,') +
			_float
	};
	/**
	 * 解析身份证号码
	 * @param {Object} o 号码值
	 */
	exports._analyzeIDCard = function(o) {
		if(o) {
			if(o.length != 18) {
				return {
					msg: '证件号码不正确'
				};
			}
			if(!/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(o)) {
				return {
					msg: '请正确填写证件号码'
				};
			}
			//验证最后一位是否正确
			if(o.substr(17) !== this._getIDChar18(o)) {
				return {
					msg: '请正确填写证件号码'
				};
			}
			//抽取中间位数获取生日
			var b = o.substr(6, 8),
				s = o.substr(16, 1),
				nb = [b.substr(0, 4), b.substr(4, 2), b.substr(6, 2)],
				birthday = nb.join('-'),
				n = new Date(),
				bd = new Date(nb[0], nb[1] - 1, nb[2]),
				age = n.getAges(birthday);
			//验证生日不能小于当前时间，月份、日在规定范围内
			if(n - bd <= 0 || nb[1] > 12 || nb[1] < 1 || nb[2] < 1 || nb[2] > 31 || age > 150 || age <= 0) {
				return {
					msg: '请正确填写证件号码'
				};
			}
			return {
				birthday: birthday,
				sex: s % 2 == 0 ? "1" : "0",
				sex_text: s % 2 == 0 ? '女' : '男',
				age: age //计算年龄
			};
		}
		return {
			msg: '证件号码不正确'
		};
	};
	/**
	 * 验证身份证最后一位数字
	 * @param {Object} id 身份证号
	 */
	exports._getIDChar18 = function(id) {
		var arr = id.split(''),
			sum = 0,
			vc = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
		for(var i = 0; i < 17; i++) sum += vc[i] * parseInt(arr[i]);
		return ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'][sum % 11];
	};
	/**
	 * 将数字转换成大写
	 * @param {Object} dValue 传入的值
	 * @param {Object} maxDec 小数位的个数
	 */
	exports._AmountInWords = function(dValue, maxDec) {
		// 验证输入金额数值或数值字符串：  
		dValue = dValue.toString().replace(/,/g, "");
		dValue = dValue.replace(/^0+/, ""); // 金额数值转字符、移除逗号、移除前导零  
		if(dValue == "") {
			return "零元整";
		} // （错误：金额为空！）  
		else if(isNaN(dValue)) {
			return "错误：金额不是合法的数值！";
		}
		var minus = ""; // 负数的符号“-”的大写：“负”字。可自定义字符，如“（负）”。  
		var CN_SYMBOL = ""; // 币种名称（如“人民币”，默认空）  
		if(dValue.length > 1) {
			if(dValue.indexOf('-') == 0) {
				dValue = dValue.replace("-", "");
				minus = "负";
			} // 处理负数符号“-”  
			if(dValue.indexOf('+') == 0) {
				dValue = dValue.replace("+", "");
			} // 处理前导正数符号“+”（无实际意义）  
		}
		var vInt = "",
			vDec = ""; // 字符串：金额的整数部分、小数部分  
		var resAIW; // 字符串：要输出的结果  
		var parts; // 数组（整数部分.小数部分），length=1时则仅为整数。  
		var digits, radices, bigRadices, decimals; // 数组：数字（0~9——零~玖）；基（十进制记数系统中每个数字位的基是10——拾,佰,仟）；大基（万,亿,兆,京,垓,杼,穰,沟,涧,正）；辅币（元以下，角/分/厘/毫/丝）。  
		var zeroCount; // 零计数  
		var i, p, d; // 循环因子；前一位数字；当前位数字。  
		var quotient, modulus; // 整数部分计算用：商数、模数。  

		// 金额数值转换为字符，分割整数部分和小数部分：整数、小数分开来搞（小数部分有可能四舍五入后对整数部分有进位）。  
		var NoneDecLen = (typeof(maxDec) == "undefined" || maxDec == null || Number(maxDec) < 0 || Number(maxDec) > 5); // 是否未指定有效小数位（true/false）  
		parts = dValue.split('.'); // 数组赋值：（整数部分.小数部分），Array的length=1则仅为整数。  
		if(parts.length > 1) {
			vInt = parts[0];
			vDec = parts[1]; // 变量赋值：金额的整数部分、小数部分  
			if(NoneDecLen) {
				maxDec = vDec.length > 5 ? 5 : vDec.length;
			}
			// 未指定有效小数位参数值时，自动取实际小数位长但不超5。  
			var rDec = Number("0." + vDec);
			rDec *= Math.pow(10, maxDec);
			rDec = Math.round(Math.abs(rDec));
			rDec /= Math.pow(10, maxDec); // 小数四舍五入  
			var aIntDec = rDec.toString().split('.');
			if(Number(aIntDec[0]) == 1) {
				vInt = (Number(vInt) + 1).toString();
			} // 小数部分四舍五入后有可能向整数部分的个位进位（值1）  
			if(aIntDec.length > 1) {
				vDec = aIntDec[1];
			} else {
				vDec = "";
			}
		} else {
			vInt = dValue;
			vDec = "";
			if(NoneDecLen) {
				maxDec = 0;
			}
		}
		if(vInt.length > 44) {
			return "错误：金额值太大了！整数位长【" + vInt.length.toString() + "】超过了上限——44位/千正/10^43（注：1正=1万涧=1亿亿亿亿亿，10^40）！";
		}

		// 准备各字符数组 Prepare the characters corresponding to the digits:  
		digits = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"); // 零~玖  
		radices = new Array("", "拾", "佰", "仟"); // 拾,佰,仟  
		bigRadices = new Array("", "万", "亿", "兆", "京", "垓", "杼", "穰", "沟", "涧", "正"); // 万,亿,兆,京,垓,杼,穰,沟,涧,正  
		decimals = new Array("角", "分", "厘", "毫", "丝"); // 角/分/厘/毫/丝  
		resAIW = ""; // 开始处理  
		// 处理整数部分（如果有）  
		if(Number(vInt) > 0) {
			zeroCount = 0;
			for(i = 0; i < vInt.length; i++) {
				p = vInt.length - i - 1;
				d = vInt.substr(i, 1);
				quotient = p / 4;
				modulus = p % 4;
				if(d == "0") {
					zeroCount++;
				} else {
					if(zeroCount > 0) {
						resAIW += digits[0];
					}
					zeroCount = 0;
					resAIW += digits[Number(d)] + radices[modulus];
				}
				if(modulus == 0 && zeroCount < 4) {
					resAIW += bigRadices[quotient];
				}
			}
			resAIW += "元";
		}
		// 处理小数部分（如果有）  
		for(i = 0; i < vDec.length; i++) {
			d = vDec.substr(i, 1);
			if(d != "0") {
				resAIW += digits[Number(d)] + decimals[i];
			}
		}

		// 处理结果  
		if(resAIW == "") {
			resAIW = "零" + "元";
		} // 零元  
		if(vDec == "") {
			resAIW += "整";
		} // ...元整  
		resAIW = CN_SYMBOL + minus + resAIW; // 人民币/负......元角分/整  
		return resAIW;
	};
	exports._foreach = function(obj, insp) {
		if(obj == null && obj.constructor != Array) {
			return [];
		}
		var i = 0,
			len = obj.length,
			r = [];
		while(i < len) {
			var x = insp(obj[i], i);
			if(x !== null) {
				r[r.length] = x;
			}
			i++;
		}
		return r;
	};
	exports._ArrayWithout = function() {
		if(arguments.length < 2) {
			return arguments.length == 1 ? arguments[0] : null;
		}
		var results = [];
		var aa = arguments[0];
		if(aa === null || aa.constructor != Array) {
			return null;
		}
		if(arguments[1].constructor == Array) {
			var args = [];
			args[0] = aa;
			foreach(arguments[1], function(v, i) {
				args[i + 1] = v;
			});
		} else {
			args = arguments;
		}
		for(var i = 0; i < aa.length; i++) {
			var isWithout = true;
			for(var j = 1; j < args.length; j++) {
				if(aa[i] == args[j]) {
					isWithout = false;
					break;
				}
			}
			if(isWithout) {
				results.push(aa[i]);
			}
		}
		return results;
	};
	/**
	 * 格式化数字
	 * @param {Object} s 原始数字
	 * @param {Object} n 小数点位数
	 */

	exports._formatNumber = function(s, n) {
		n = n > 0 && n <= 20 ? n : 0;
		s = parseFloat((s + "").replace(/[^\d\.-]/g, ""));
		s = (n > 0 ? s.toFixed(n) : s) + '';
		var l = s.split(".")[0].split("").reverse(),
			r = s.split(".")[1];
		t = "";
		for(i = 0; i < l.length; i++) {
			t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : "");
		}
		return t.split("").reverse().join("") + (n > 0 ? ("." + r) : '');
	};
	/**
	 * 存储数据到LocalStorage中
	 * @param {Object} key 存储主键
	 * @param {Object} dataStr 数据集JSON字符串
	 * @param {Object} replace 是否替换
	 */
	exports._saveLocalStorage = function(key, dataStr, replace) {
		var ls = window.localStorage,
			d = ls.getItem(key);
		if(d || replace) {
			ls.removeItem(key);
		}
		ls.setItem(key, dataStr);
	};
	/**
	 * 获取LocalStorage中数据
	 * @param {Object} key 存储主键
	 */
	exports._getLocalStorage = function(key) {
		var d = window.localStorage.getItem(key);
		if(d) {
			return d;
		}
		return "";
	};
	/**
	 * 获取LocalStorage中数据
	 * @param {String} key 存储主键,可以是多个之间逗号分隔字符串
	 * @param {String} suffix 后缀
	 */
	exports._removeLocalStorage = function(key, suffix) {
		suffix = suffix || '';
		key = key.split(',');
		for(var i = 0, l = key.length; i < l; i++) {
			var d = window.localStorage.getItem(key[i] + suffix);
			if(d) {
				window.localStorage.removeItem(key[i] + suffix);
			}
		}
	};
	/**
	 * 获取当前操作保单ID
	 */
	exports._getOrderIDOfLocalStorage = function() {
		return window.localStorage.getItem('cOID');
	};
	/**
	 * 保存当前操作保单ID
	 */
	exports._setOrderIDOfLocalStorage = function(v) {
		return window.localStorage.setItem('cOID', v);
	};
	/**
	 * ajax异步请求接口
	 * @param {Object} opt 提交参数值
	 */
	exports._ajaxInterface = function(opt, callback, errback) {
		var _t = this;
		$.ajax($.extend(true, {
			type: "post",
			url: "",
			headers: {
				'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
			},
			async: true,
			success: function(result) {
				if(result && result.success == 1) {
					callback && callback.call(this, result);
				} else {
					console.log(result.msg || '调用接口失败!')
				}
			},
			error: errback || function(err) {
				_t._closeLoadding();
				console.log("ajax错误", opt, err);
			}
		}, opt));
	};
	/**
	 * 修改元素的样式
	 * @param {Object} el 待处理元素
	 * @param {Object} rm 移除样式名称数组
	 * @param {Object} ad 新增样式名称数组
	 */
	exports._changeElClass = function(el, rm, ad) {
		rm = Object.prototype.toString.call(rm) == '[object Array]' ? rm.join(' ') : rm;
		ad = Object.prototype.toString.call(ad) == '[object Array]' ? ad.join(' ') : ad;
		if(el) {
			el.removeClass(rm).addClass(ad);
		}
	};
	/**
	 * @description 拓展Date操作,格式化时间
	 * @param format 格式化字符串，如:'yyyy-MM-dd hh:mm:ss:S'或'E'
	 */
	window.Date.prototype.format = function(format) {
		var o = {
			'M+': this.getMonth() + 1, // Month
			'd+': this.getDate(), // day
			'h+': this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时 
			'a+': this.getHours() > 12 ? 'PM' : 'AM', //上午/下午
			'A+': this.getHours() > 12 ? '下午' : '上午', //上午/下午
			'H+': this.getHours(), //小时 
			'm+': this.getMinutes(), // minute
			's+': this.getSeconds(), // second
			'q+': Math.floor((this.getMonth() + 3) / 3), // quarter
			'S+': this.getMilliseconds() // millisecond
		}
		var week = {
			"0": "\u65e5",
			"1": "\u4e00",
			"2": "\u4e8c",
			"3": "\u4e09",
			"4": "\u56db",
			"5": "\u4e94",
			"6": "\u516d"
		};
		if(/(y+)/.test(format)) {
			format = format.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));
		}
		if(/(E+)/.test(format)) {
			format = format.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : "") + week[this.getDay() + ""]);
		}
		for(var k in o) {
			if(new RegExp('(' + k + ')').test(format)) {
				format = format.replace(RegExp.$1, RegExp.$1.langth == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
			}
		}
		return format;
	};
	/**
	 * @description 获取当前时间的中文形式
	 * @param format 格式化字符串
	 */
	window.Date.prototype.getCNDate = function(format) {
		var o = {
			'M+': this.getMonth().lenWithZero(2) + new Number(26376).chrW(), // Month
			'd+': this.getDate().lenWithZero(2) + new Number(26085).chrW(), // day
			'h+': this.getHours().lenWithZero(2) + new Number(26102).chrW(), //小时           
			'H+': this.getHours().lenWithZero(2) + new Number(26102).chrW(), //小时 
			'm+': this.getMinutes().lenWithZero(2) + new Number(20998).chrW(), // minute
			's+': this.getSeconds().lenWithZero(2) + new Number(31186).chrW(), // second
			'q+': new Number(32).chrW() + new Number(32).chrW() + new Number(26143).chrW() + new Number(26399).chrW() + new String('26085199682010819977222352011620845').substr(this.getDay() * 5, 5).ToInt().chrW() // quarter
		}
		if(/(y+)/.test(format)) {
			var y = this.getFullYear().lenWithZero(4) + new Number(24180).chrW();
			format = format.replace(RegExp.$1, (y + ''));
		}
		for(var k in o) {
			if(new RegExp('(' + k + ')').test(format)) {
				format = format.replace(RegExp.$1, RegExp.$1.langth == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
			}
		}
		return format;
	};
	/**
	 * @description 校验时间与当前系统时间的时间差
	 * @param datetime 需要校验的时间
	 * @param interval 校验格式,默认为d
	 */
	window.Date.prototype.Diff = function(datetime, interval) {
		//若参数不足或 datetime 不是日期类型則回传 undefined  
		if(!datetime || datetime.constructor != Date) return undefined;

		interval = interval || 'd';
		switch(interval) {
			//计算秒差                                                          
			case 's':
				return parseInt((datetime - this) / 1000);
				//计算分差  
			case 'n':
				return parseInt((datetime - this) / 60000);
				//计算時差  
			case 'h':
				return parseInt((datetime - this) / 3600000);
				//计算日差  
			case 'd':
				return parseInt((datetime - this) / 86400000);
				//计算周差  
			case 'w':
				return parseInt((datetime - this) / (86400000 * 7));
				//计算月差  
			case 'm':
				return(datetime.getMonth() + 1) + ((datetime.getFullYear() - this.getFullYear()) * 12) - (this.getMonth() + 1);
				//计算年差  
			case 'y':
				return datetime.getFullYear() - this.getFullYear();
				//输入有误  
			default:
				return undefined;
		}
	};
	/**
	 * @description 增减天数后返回时间对象
	 * @param days 天数数量，可以为正负整数
	 */
	window.Date.prototype.addDays = Date.prototype.addDays || function(days) {
		days = days || 0;
		this.setDate(this.getDate() + days);
		return this;
	};
	/**
	 * @description 增减月后返回时间对象
	 * @param month 月数量，可以为正负整数
	 */
	window.Date.prototype.addMonths = Date.prototype.addMonths || function(month) {
		month = month || 0;
		this.setMonth(this.getMonth() + month);
		return this;
	};
	/**
	 * @description 增减年后返回时间对象
	 * @param year 年数量，可以为正负整数
	 */
	window.Date.prototype.addYears = Date.prototype.addYears || function(year) {
		year = year || 0;
		this.setYear(this.getFullYear() + year);
		return this;
	};
	/**
	 * @description 计算年龄
	 * @param birthday 生日日期
	 * @param type 计算方式，y:直接年相减,默认值;s:计算到秒
	 */
	window.Date.prototype.getAges = Date.prototype.getAges || function(birthday, type) {
		var brDay, t = type || 'y';
		if(Object.prototype.toString.call(birthday) == '[object Date]') {
			brDay = birthday;
		} else if(Object.prototype.toString.call(birthday) == '[object String]') {
			if(birthday.indexOf('-') > -1 || birthday.indexOf('/') > -1) {
				var bs = birthday.split(/-|\//g);
				brDay = new Date(bs[0], bs[1] - 1, bs[2]);
			} else {
				brDay = new Date(b.substr(0, 4), b.substr(4, 2), b.substr(6, 2));
			}
		} else {
			return 0;
		}
		return t == 'y' ? (this.getFullYear() - brDay.getFullYear()) : ((this.getTime() - brDay.getTime()) / (24 * 3600 * 1000 * 365));
	};
	/**
	 * @description 获取指定月份的天数
	 * @param month 月份数(默认指本月)
	 * @param year 年份(默认指本年)
	 */
	window.Date.prototype.getDays = Date.prototype.getDays || function(month, year) {
		year = year || this.getFullYear();
		month = month || this.getMonth();
		return new Date(year, month, 0).getDate();
	};
	/**
	 * @description 获取指定日期是本年的第几周
	 * @param {Date} date 需要获取的日期
	 * @return {Int} 返回指定日期为本年度的第几周
	 */
	window.Date.prototype.getYearWeek = Date.prototype.getYearWeek || function(date) {
		date = date || this;
		var date2 = new Date(date.getFullYear(), 0, 1),
			day1 = date.getDay();
		if(day1 == 0) day1 = 7;
		var day2 = date2.getDay();
		if(day2 == 0) day2 = 7;
		var d = Math.round((date.getTime() - date2.getTime() + (day2 - day1) * (24 * 60 * 60 * 1000)) / 86400000);
		//return Math.ceil(d/7)+1;//向上取整,有小数就整数部分加1
		return parseInt(d / 7) + 1; //丢弃小数部分,保留整数部分
	};
	/**
	 * @description 获取指定日期
	 * @param p 指定参数,年(y)、月(m)、周(w)、季度(q),默认为月份
	 * @param istime 返回值是否携带时间,false默认值，不携带,true为携带返回日期,如:2014-11-01 00:00:00
	 * @param fol first or last(第一天或最后一天)
	 */
	window.Date.prototype.getDateFromParam = Date.prototype.getDateFromParam || function(p, istime, fol) {
		istime = istime || true;
		p = (p || 'm').toLowerCase(); //都转化为小写,默认值为月份
		var return_time = [], // 分别存储开始时间和结束时间
			date = this,
			start, end, o = {
				'm': date.getMonth() + 1, // Month
				'd': date.getDate(), // day
				'y': date.getFullYear(), // year
				'w': date.getDay() // week
			}
		switch(p) {
			// 星期
			case 'w':
				return_time = [new Date(o['y'], o['m'] - 1, o['d'] - o['w'] + 1, 0, 0, 0), new Date(o['y'], o['m'] - 1, o['d'] - o['w'] + 7, 23, 59, 59)];
				break;
				// 月
			case 'm':
				return_time = [new Date(o['y'], o['m'] - 1, 1, 0, 0, 0), new Date(o['y'], o['m'] - 1, this.getDays(o['m'], o['y']), 23, 59, 59)];
				break;
				// 年
			case 'y':
				return_time = [new Date(o['y'], 0, 1, 0, 0, 0), new Date(o['y'], 11, this.getDays(o['m'], o['y']), 23, 59, 59)];
				break;
				// 季度
			case 'q':
				var quarter = parseInt(date.format('q')); //获取季度
				var ms = quarter == 1 ? [0, 2] : (quarter == 2 ? [3, 5] : (quarter == 3 ? [6, 8] : [9, 11]));
				return_time = [new Date(o['y'], ms[0], 1, 0, 0, 0), new Date(o['y'], ms[1], this.getDays(o['m'], ms[1]), 23, 59, 59)];
				break;
			default:
				return_time = [undefined, undefined];
				break;
		}
		if(!istime) {
			return_time = [return_time[0].format('yyyy-MM-dd H:m:ss'), return_time[1].format('yyyy-MM-dd H:m:ss')];
		}
		//返回对应的值
		if(fol) {
			if(fol == 'last') return return_time[1];
			if(fol == 'first') return return_time[0];
		}
		return return_time;
	};
});